package modelo.servicio;

import java.util.List;
import modelo.bd.dao.DocumentoDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Documento;

public class Documentos {

    private static Documentos instancia;
    private DocumentoDAO dao;

    private Documentos() {
        this.dao = new DocumentoDAO();
    }

    public static Documentos instancia() {
        if (instancia == null) {
            instancia = new Documentos();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Documentos.");
    }

    public List<Documento> obtenerPorSeccion(int idSeccion) {
        try {
            return dao.selectWhere("ID_SECCION = " + idSeccion + " AND TIPO_DOC != 'CUMP' ");
        } catch (DAOException ex) {
            return null;
        }
    }

    public Documento obtenerPorId(String clave) throws DAOException {
        return dao.selectWhere("CLAVE_DOC = '" + clave + "'").get(0);
                
    }
    
    public int obtenerTotal(Integer seccion) 
            throws DAOException {
        return dao.selectCount(seccion);
    }
    
    public String obtenerProxFolio(String tipoDoc, Integer area) 
            throws DAOException{
        return dao.selectNextFolio(tipoDoc,area);
    }
    
    public List<Documento> obtenerPorRango(int desde, int hasta, Integer seccion) 
            throws DAOException {
        return dao.selectPag(desde, hasta, seccion);
    }
    
    public void agregar(Documento doc) 
            throws DAOException {
        dao.add(doc);
    }

    public void eliminar(String clave) throws DAOException {
        //dao.deleteWhere("CLAVE_DOC = '" + clave + "'");
        Documento doc = obtenerPorId(clave);
        doc.getHistorico().setEstado("IN");
        dao.update(doc);
    }

    public void actualizar(Documento doc) throws DAOException {
        doc.getHistorico().setEstado("ED");
        dao.update(doc);
    }
    
    public boolean existe (String clave) throws DAOException{
        return !dao.selectWhere("CLAVE_DOC = '"+clave+"'").isEmpty();
    }
    
    public List<Documento> obtenerCumpLibresPorActividad(Integer idAct) throws DAOException{
        String query = " ID_SECCION IN (SELECT ID_SECCION FROM SSMA_DOCUMENTOS_T WHERE CLAVE_DOC IN"
                + " ( SELECT CLAVE_DOC FROM SSMA_CONDICIONANTES_T WHERE ID_CONDICIONANTE IN "
                + " ( SELECT ID_CONDICIONANTE FROM SSMA_ACTIVIDADES_T WHERE ID_ACTIVIDAD = "+ idAct +"  ))) "
                + " AND TIPO_DOC = 'CUMP' "
                + " AND CLAVE_DOC NOT IN "
                + " (SELECT CLAVE_DOC FROM SSMA_ACTIVIDADES_T WHERE CLAVE_DOC IS NOT NULL) ";
        return dao.selectWhere(query);
    }
    
    public List<Documento> obtenerPorArea(Integer idArea) throws DAOException{
        String query = " ID_SECCION IN ( SELECT ID_SECCION FROM SSMA_SECCIONES_T WHERE ID_AREA = "+idArea+")";
        return dao.selectWhere(query);
    }
}
